package cn.drenal.capcap.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.drenal.capcap.common.Response;
import cn.drenal.capcap.entity.dto.PasswordDTO;
import cn.drenal.capcap.entity.SysAdmin;
import cn.drenal.capcap.entity.dto.AdminDTO;
import cn.drenal.capcap.entity.vo.AdminListVO;
import cn.drenal.capcap.service.AdminService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * 管理员控制器
 */
@RestController
@RequestMapping("/admin/manage")
@RequiredArgsConstructor
public class AdminController {

    private final AdminService adminService;

    /**
     * 创建管理员
     *
     * @param adminDTO 管理员信息
     * @return 创建结果
     */
    @PostMapping
    @SaCheckPermission("system:admin:manage:add")
    public Response<SysAdmin> createAdmin(@RequestBody AdminDTO adminDTO) {
        return Response.success(adminService.createAdmin(adminDTO));
    }

    /**
     * 更新管理员信息
     *
     * @param id 管理员ID
     * @param adminDTO 管理员信息
     * @return 更新结果
     */
    @PutMapping("/{id}")
    @SaCheckPermission("system:admin:manage:edit")
    public Response<SysAdmin> updateAdmin(@PathVariable Long id, @RequestBody AdminDTO adminDTO) {
        return Response.success(adminService.updateAdmin(id, adminDTO));
    }

    /**
     * 删除管理员
     *
     * @param id 管理员ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @SaCheckPermission("system:admin:manage:delete")
    public Response<Void> deleteAdmin(@PathVariable Long id) {
        String currentUserId = StpUtil.getLoginIdAsString();
        if (id.equals(currentUserId)) {
            return Response.error("不能删除当前登录用户");
        }
        adminService.deleteAdmin(id);
        return Response.success();
    }

    /**
     * 分页查询管理员列表
     *
     * @param current 当前页
     * @param size 每页大小
     * @param username 用户名（模糊查询）
     * @param nickname 昵称（模糊查询）
     * @param phone 手机号（模糊查询）
     * @return 管理员列表
     */
    @GetMapping
    @SaCheckPermission("system:admin:manage:list")
    public Response<Page<AdminListVO>> getAdminList(
            @RequestParam(defaultValue = "1") long current,
            @RequestParam(defaultValue = "10") long size,
            @RequestParam(required = false) String username,
            @RequestParam(required = false) String nickname,
            @RequestParam(required = false) String phone) {
        Page<SysAdmin> page = new Page<>(current, size);
        return Response.success(adminService.getAdminList(page, username, nickname, phone));
    }

    /**
     * 根据ID查询管理员
     *
     * @param id 管理员ID
     * @return 管理员信息
     */
    @GetMapping("/{id}")
    @SaCheckPermission("system:admin:manage:query")
    public Response<SysAdmin> getAdminById(@PathVariable Long id) {
        return Response.success(adminService.getAdminById(id));
    }

    /**
     * 修改管理员密码
     *
     * @param id 管理员ID
     * @param passwordDTO 密码信息DTO
     * @return 修改结果
     */
    @PutMapping("/{id}/password")
    @SaCheckPermission("system:admin:manage:password")
    public Response<Void> updatePassword(
            @PathVariable Long id,
            @RequestBody PasswordDTO passwordDTO) {
        adminService.updatePassword(id, passwordDTO.getOldPassword(), passwordDTO.getNewPassword());
        return Response.success();
    }
}